home *** CD-ROM | disk | FTP | other *** search
/ Clickx 115 / Clickx 115.iso / software / tools / windows / tails-i386-0.16.iso / live / filesystem.squashfs / usr / share / pyshared / GdmGreeter / langpanel.py < prev    next >
Encoding:
Python Source  |  2013-01-10  |  10.6 KB  |  285 lines

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. #
  4. # Copyright 2012 Tails developers <tails@boum.org>
  5. # Copyright 2011 Max <govnototalitarizm@gmail.com>
  6. #
  7. # This program is free software: you can redistribute it and/or modify
  8. #  it under the terms of the GNU General Public License as published by
  9. #  the Free Software Foundation, either version 3 of the License, or
  10. #  (at your option) any later version.
  11. #
  12. #  This program is distributed in the hope that it will be useful,
  13. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. #  GNU General Public License for more details.
  16. #
  17. #  You should have received a copy of the GNU General Public License
  18. #  along with this program.  If not, see <http://www.gnu.org/licenses/>
  19. #
  20. """Localization panel
  21.  
  22. """
  23.  
  24. import logging, gtk, gettext, os
  25. _ = gettext.gettext
  26. from GdmGreeter.language import TranslatableWindow
  27. import GdmGreeter
  28. import GdmGreeter.language as language
  29.  
  30. class LangDialog(TranslatableWindow):
  31.     """Language selection dialog"""
  32.  
  33.     def __init__(self):
  34.         builder = gtk.Builder()
  35.         builder.set_translation_domain(GdmGreeter.__appname__)
  36.         builder.add_from_file(os.path.join(GdmGreeter.GLADE_DIR, "langdialog.glade"))
  37.         self.dialog = builder.get_object("languages_dialog")
  38.         self.treeview = builder.get_object("languages_treeview")
  39.         self.liststore = builder.get_object("languages_liststore")
  40.         builder.connect_signals(self, self.dialog)
  41.  
  42.         tvcolumn = gtk.TreeViewColumn(_("Language"))
  43.         self.treeview.append_column(tvcolumn)
  44.         cell = gtk.CellRendererText()
  45.         tvcolumn.pack_start(cell, True)
  46.         tvcolumn.add_attribute(cell, 'text', 1)
  47.  
  48.         TranslatableWindow.__init__(self, self.dialog)
  49.  
  50.     def cb_langdialog_key_press(self, widget, event, data=None):
  51.         """Handle key press in langdialog"""
  52.         if event.keyval in [ gtk.keysyms.Return, gtk.keysyms.KP_Enter ]:
  53.             if isinstance(data, gtk.Dialog):
  54.                 data.response(True)
  55.  
  56.     def cb_langdialog_button_press(self, widget, event, data=None):
  57.         """Handle mouse click in langdialog"""
  58.         if (event.type == gtk.gdk._2BUTTON_PRESS or
  59.                 event.type == gtk.gdk._3BUTTON_PRESS):
  60.             if isinstance(data, gtk.Dialog):
  61.                 data.response(True)
  62.  
  63. class LangPanel(TranslatableWindow):
  64.     """Display language and layout selection panel"""
  65.  
  66.     def __init__(self, greeter):
  67.         self.greeter = greeter
  68.  
  69.         # XXX: initialize instance variables
  70.         self.additional_language_displayed = False
  71.         self.additional_layout_displayed = False
  72.         self.default_position = 0
  73.  
  74.         # Build UI
  75.         builder = gtk.Builder()
  76.         builder.set_translation_domain(GdmGreeter.__appname__)
  77.         builder.add_from_file(os.path.join(GdmGreeter.GLADE_DIR, "langpanel.glade"))
  78.         builder.connect_signals(self)
  79.         self.window = builder.get_object("langpanel")
  80.  
  81.         cell = gtk.CellRendererText()
  82.  
  83.         self.cb_languages = builder.get_object("lang_list_cbox")
  84.         self.cb_languages.pack_start(cell, True)
  85.         self.cb_languages.add_attribute(cell, 'text', 1)
  86.  
  87.         self.cb_locales = builder.get_object("locale_cbox")
  88.         self.cb_locales.pack_start(cell, True)
  89.         self.cb_locales.add_attribute(cell, 'text', 1)
  90.  
  91.         self.cb_layouts = builder.get_object("layout_cbox")
  92.         self.cb_layouts.pack_start(cell, True)
  93.         self.cb_layouts.add_attribute(cell, 'text', 1)
  94.  
  95.         self.cb_variants = builder.get_object("variant_cbox")
  96.         if self.cb_variants:
  97.             self.cb_variants.pack_start(cell, True)
  98.             self.cb_variants.add_attribute(cell, 'text', 1)
  99.  
  100.         TranslatableWindow.__init__(self, self.window)
  101.  
  102.         self.populate_languages()
  103.         self.cb_languages.set_active(self.default_position)
  104.         self.set_panel_geometry()
  105.  
  106.     def set_panel_geometry(self):
  107.         """Position panel to bottom and use full screen width"""
  108.         panel = self.window
  109.         panel.set_gravity(gtk.gdk.GRAVITY_SOUTH_WEST)
  110.         width, height = panel.get_size()
  111.         panel.set_default_size(gtk.gdk.screen_width(), height)
  112.         panel.move(0, gtk.gdk.screen_height() - height)
  113.  
  114.     # Populate lists
  115.  
  116.     def populate_languages(self):
  117.         """Create all the required entries"""
  118.         count = 0
  119.         for l in self.greeter.localisationsettings.get_default_languages_with_names():
  120.             self.cb_languages.get_model().append(l)
  121.             if l[0] == self.greeter.localisationsettings.get_language():
  122.                 self.default_position = count
  123.             count += 1
  124.         self.cb_languages.get_model().append(['+', _("Other...")])
  125.  
  126.     def populate_locales(self):
  127.         """populate the lists for a given language"""
  128.         self.cb_locales.get_model().clear()
  129.         count = 0
  130.         default_position = 0
  131.         for l in self.greeter.localisationsettings.get_default_locales_with_names():
  132.             self.cb_locales.get_model().append(l)
  133.             if l[0] == self.greeter.localisationsettings.get_locale():
  134.                 default_position = count
  135.             count += 1
  136.         self.cb_locales.set_active(default_position)
  137.  
  138.     def populate_layouts(self):
  139.         """populate the lists for current locale"""
  140.         self.cb_layouts.get_model().clear()
  141.         count = 0
  142.         default_position = 0
  143.         for l in self.greeter.localisationsettings.get_default_layouts_with_names():
  144.             self.cb_layouts.get_model().append(l)
  145.             if l[0] == self.greeter.localisationsettings.get_layout():
  146.                 default_position = count
  147.             count += 1
  148.         self.cb_layouts.get_model().append(['+', _("Other...")])
  149.         self.cb_layouts.set_active(default_position)
  150.  
  151.     # Callbacks
  152.  
  153.     def key_event_cb(self, widget, event=None):
  154.         """Handle key event - check for layout change"""
  155.         if event:
  156.             if (event.keyval == gtk.keysyms.ISO_Next_Group or
  157.                 event.keyval ==  gtk.keysyms.ISO_Prev_Group):
  158.                 pass
  159.  
  160.     def layout_selected(self, widget):
  161.         """handler for combobox selecion event"""
  162.         selected_layout = None
  163.         i = self.cb_layouts.get_active_iter()
  164.         if i and  self.cb_layouts.get_model().get(i, 0)[0] == '+':
  165.             selected_layout = self.show_more_layouts()
  166.         else:
  167.             i = self.cb_layouts.get_active_iter()
  168.             if i:
  169.                 selected_layout = self.cb_layouts.get_model().get(i, 0)[0]
  170.  
  171.         if selected_layout:
  172.             self.greeter.localisationsettings.set_layout(selected_layout)
  173.             i = self.cb_layouts.get_active_iter()
  174.             if i and not selected_layout == self.cb_layouts.get_model().get(i, 0)[0]:
  175.                 self.update_other_layout_entry(selected_layout)
  176.  
  177.     # "Other..." layouts dialog handeling
  178.  
  179.     def update_other_layout_entry(self, layout=None):
  180.         if not layout:
  181.             layout = _("Other...")
  182.         last_entry = self.cb_layouts.get_model().iter_n_children(None) - 1
  183.         if not self.additional_layout_displayed:
  184.             self.cb_layouts.get_model().insert(
  185.                 last_entry,
  186.                 [layout, language.layout_name(layout)])
  187.             self.cb_layouts.set_active(last_entry)
  188.             self.additional_layout_displayed = True
  189.         else:
  190.             self.cb_layouts.get_model().set(
  191.                 self.cb_layouts.get_model().get_iter(last_entry - 1),
  192.                 0, layout,
  193.                 1, language.layout_name(layout))
  194.             self.cb_layouts.set_active(last_entry - 1)
  195.  
  196.     def show_more_layouts(self):
  197.         """Show a dialog to allow selecting more layouts"""
  198.  
  199.         dialog = LangDialog()
  200.  
  201.         count = 0
  202.         for l in self.greeter.localisationsettings.get_layouts_with_names():
  203.             dialog.liststore.append(l)
  204.             # XXX
  205.             if self.greeter.localisationsettings.get_layout() == l[0]:
  206.                 self.default_position = count
  207.             count += 1
  208.  
  209.         layout = None
  210.         if dialog.dialog.run():
  211.             dummy, selected_iter = dialog.treeview.get_selection().get_selected()
  212.             if selected_iter:
  213.                 layout = dialog.liststore[selected_iter][0]
  214.  
  215.         dialog.dialog.destroy()
  216.  
  217.         return layout
  218.  
  219.     def locale_selected(self, widget):
  220.         """handler for locale combobox selection event"""
  221.         i = self.cb_locales.get_active_iter()
  222.         if i:
  223.             l = self.cb_locales.get_model().get(i, 0)[0]
  224.             if l:
  225.                 self.greeter.localisationsettings.set_locale(l)
  226.                 self.populate_layouts()
  227.  
  228.     def language_selected(self, widget):
  229.         """handler for language combobox selection event"""
  230.  
  231.         selected_language = None
  232.         i = self.cb_languages.get_active_iter()
  233.         if i:
  234.             if self.cb_languages.get_model().get(i, 0)[0] == '+':
  235.                 selected_language = self.show_more_languages()
  236.             else:
  237.                 selected_language = self.cb_languages.get_model().get(i, 0)[0]
  238.  
  239.         if selected_language:
  240.             self.greeter.localisationsettings.set_language(selected_language)
  241.             self.populate_locales()
  242.             i = self.cb_languages.get_active_iter()
  243.             if i and not selected_language == self.cb_languages.get_model().get(i, 0)[0]:
  244.                 self.update_other_language_entry(selected_language)
  245.  
  246.     # "Other..." language dialog handeling
  247.  
  248.     def update_other_language_entry(self, lang):
  249.         last_entry = self.cb_languages.get_model().iter_n_children(None) - 1
  250.         if not self.additional_language_displayed:
  251.             self.cb_languages.get_model().insert(
  252.                 last_entry,
  253.                 [lang, language.language_name(lang)])
  254.             self.cb_languages.set_active(last_entry)
  255.             self.additional_language_displayed = True
  256.         else:
  257.             self.cb_languages.get_model().set(
  258.                 self.cb_languages.get_model().get_iter(last_entry - 1),
  259.                 0, lang,
  260.                 1, language.language_name(lang))
  261.             self.cb_languages.set_active(last_entry - 1)
  262.  
  263.     def show_more_languages(self):
  264.         """Show a dialog to allow selecting more languages"""
  265.  
  266.         langdialog = LangDialog()
  267.  
  268.         count = 0
  269.         for l in self.greeter.localisationsettings.get_languages_with_names():
  270.             langdialog.liststore.append(l)
  271.             # XXX
  272.             if self.greeter.localisationsettings.get_language() == l[0]:
  273.                 self.default_position = count
  274.             count += 1
  275.  
  276.         lang = None
  277.         if langdialog.dialog.run():
  278.             dummy, selected_iter = langdialog.treeview.get_selection().get_selected()
  279.             if selected_iter:
  280.                 lang = langdialog.liststore[selected_iter][0]
  281.  
  282.         langdialog.dialog.destroy()
  283.  
  284.         return lang
  285.